# -*-coding:utf-8-*-
import numpy as np

"""
sort(a, axis, kind):    排序，kind['quicksort'(默认),'mergesort','heapsort']，axis=None时按最后一维排序
argsort(a, axis, kind): 返回排序后的数组元素在原数组中的下标
nonzero(a):             返回非零元素在数组中的整数索引（格式为tuple(*ndarray),有几维就有几个数组,数组中相同位置元素组成非零元素的整数索引）
count_nonzero(a, axis): 返回非零元素的个数
flatnonzero(a):         返回非零元素在数组变成一维情况下的索引
isnan(a)                返回a对应元素是否为空（空为True,非空为False）的数组
where(condition,x,y):   （1）当x和y都为None时，返回输入数组中满足给定条件的元素的整数索引（格式和nonzero()相同）
                        （2）当x和y有值且三个参数之间能广播时，先将condition,x,y广播成c1,x1,y1使三者形状一致，返回一个形状一致
                        的数组，其元素为：若c1中为True的取x1中对应的值，否则取y1中对应的值
amax/amin(a,axis,where,initial):数组的最大值（axis=None时）或沿轴的最大/小值。where和initial必须同时存在，where是一个可以和a广播
                        的只有True、False值的数组，a中的元素对应广播后的where中的元素为False时将被初始化为initial的值。
argmax/min(a, axis):    返回最大最小元素在数组中的下标
sum(a,axis,where,initial):沿轴的和，默认True=1，False=0，NaN=0
ptp(a,axis):            沿轴的值范围（最大值-最小值），axis=None统计整个数组的值范围（下面函数同理）
median(a,axis):         沿轴的中位数
mean(a,axis):           沿轴的算数平均数
average(a,axis,weights):沿轴的加权平均数（weights=None时相当于mean函数）
std(a,axis,dtype):      沿轴的标准差。整数数组返回float64，浮点数组返回相同类型（此时dtype要指定为float64防止精度问题导致数据不准确）
var(a,axis,dtype):      沿轴的方差。整数数组返回float64，浮点数组返回相同类型（此时dtype要指定为float64防止精度问题导致数据不准确）

"""
a: np.ndarray = np.arange(1, 13).reshape(3, 4)
a1 = np.array([[3, 7, 8, 1], [9, 4, 6, 0], [11, 5, 2, 10]])
# 数组的最大值
np.amax(a)  # 12，axis为None统计整个数组最大值
np.amax(a, axis=0)  # [9 10 11 12]，统计每列最大值
np.amax(a, axis=1, where=a > 8, initial=9)  # [9 9 12]，a中不大于8的元素初始化成9，再统计每行的最大值
np.amax(a, axis=1, where=[True, True, True, False], initial=9)  # [9 9 11]，a中最后一列的元素初始化成9，再统计每行的最大值
np.argmax(a, axis=1)  # [3 3 3]，a中每行最大元素的下标
# 数组的值范围
np.ptp(a, axis=0)  # [8 8 8 8], 统计每列的值范围
# 加权平均数
np.average(a, axis=1, weights=[1, 2, 3, 4])  # [3. 7. 11.],统计每行的加权平均数（一行数据中相应的权为1、2、3、4）
# 排序
np.sort(a1)  # [[1 3 7 8] [0 4 6 9] [2 5 10 11]]，按最后一维排序（最后一维为1，相当于axis=1）
np.sort(a1, axis=0)  # [[3 4 2 0] [9 5 6 1] [11 7 8 10]]，按列排序
np.argsort(a1, axis=1)  # [[3 0 1 2] [3 1 2 0] [2 1 3 0]]
# 非零元素
np.nonzero(a1)  # tuple([0 0 0 0 1 1 1 2 2 2 2]), [0 1 2 3 0 1 2 0 1 2 3])，即非零元素索引为[0,0][0,1][0,2]...[2,2][2,3]
np.flatnonzero(a1)  # [ 0  1  2  3  4  5  6  8  9 10 11]，非零元素在数组变成一维情况下的索引

# where函数，**此函数比较难理解**
np.where(a1 > 5)  # tuple([0 0 1 1 2 2], [1 2 0 2 0 3])，返回a中大于5的元素的整数索引
# c广播成[[True False][True False]]，返回(2,2)的数组，第0列元素来自x，第1列元素来自y
np.where([True, False], [[1, 2], [3, 4]], [[9, 8], [7, 6]])  # [[1 8] [3 6]]
# x广播成[[1 1 1 1][1 1 1 1][1 1 1 1]]，y同理，返回(3,4)的数组，对应a中小于6的取1，否则取99
np.where(a < 6, 1, 99)  # [[1 1 1 1] [1 99 99 99 [99 99 99 99]]
# 三个参数形状一致不需要广播，返回(3,4)的数组，对应a中小于6的取原来的中，否则取a*2中的值
x = np.where(a < 6, a, a * 2)

# 统计空值
a2 = np.array([[1, 2, 3], [np.NAN, None, 6]], dtype=float)  # 有None时dtype要指定为float(否则为object)才能使用isnan()
ary = np.isnan(a2)  # [[False False False] [True True False]]，isnan会把None看成空值
count_nan = ary.sum()  # 2，统计出空值个数
